package analyse

import (
	"github.com/gofiber/fiber/v2"
	"sg-backend/global"
	"sg-backend/model/paylog"
	"sg-backend/utils"
	"sort"
	"strconv"
	"strings"
	"time"
)

// 收入分类json
type _incomeJsonType struct {
	TypeList []string `json:"typeList"`
}

// 饼图json
type _PieJson struct {
	Name  string  `json:"name"`
	Value float64 `json:"value"`
}

// 1，年度收入分类统计

func GetIncomePieData(ctx *fiber.Ctx) error {
	/**
	 * 获取选定年份的年收入分类汇总
	 */
	// 1,获取年份
	year := ctx.QueryInt("year", time.Now().Year())

	// 整理年份起止
	startDate := strconv.Itoa(year) + "-01-01 00:00:00"
	endDate := strconv.Itoa(year) + "-12-31 23:59:59"

	// 2，获取用户的收入分类
	var incomeTypeList []paylog.IncomeType
	if err := global.DB.Where("user_id = ?", global.AuthUser.UserId).Find(&incomeTypeList); err.Error != nil {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": "解构收入类型List失败！！",
		})
	}

	// 数据容器
	var data []_PieJson

	// 开始获取统计
	for _, v := range incomeTypeList {
		var incomeLog []paylog.IncomeLog
		if err := global.DB.Where("user_id = ? AND income_type_id = ?", global.AuthUser.UserId, v.Id).
			Where("time >= ? AND time <= ?", startDate, endDate).
			Find(&incomeLog); err.Error != nil {
			return ctx.JSON(fiber.Map{
				"status":  "error",
				"message": "根据分类获取收入数据出错！" + err.Error.Error(),
			})
		}

		// 汇总数据
		total := float64(0)
		for _, x := range incomeLog {
			total = total + x.Money
		}
		total = utils.NumberToStr(total)
		data = append(data, _PieJson{
			Name:  v.Name,
			Value: total,
		})
	}

	// list排序
	sort.Slice(data, func(i, j int) bool {
		return data[i].Value < data[j].Value // 可以将<号修改为>更换为倒序排序
	})

	// 返回
	return ctx.JSON(fiber.Map{
		"status": "done",
		"data":   data,
	})
}

// 2，月度收入统计

func GetMonthlyIncomePieData(ctx *fiber.Ctx) error {
	/**
	 * 获取选定月份的收入分类汇总
	 */
	// 1,获取月份Str  2023-09
	month := ctx.Query("month")
	queryList := strings.Split(month, "-")

	// 整理月份起止
	// 年份月份转为INT
	yearInt, _ := strconv.Atoi(queryList[0])
	monthInt, _ := strconv.Atoi(queryList[1])
	startDate := strconv.Itoa(yearInt) + "-" + strconv.Itoa(monthInt) + "-01 00:00:00" // 当月1日
	endDate := strconv.Itoa(yearInt) + "-" + strconv.Itoa(monthInt+1) + "-01 00:00:00" // 下月1日

	// 2，获取用户的收入分类
	var incomeTypeList []paylog.IncomeType
	if err := global.DB.Where("user_id = ?", global.AuthUser.UserId).Find(&incomeTypeList); err.Error != nil {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": "解构收入类型List失败！！",
		})
	}

	// 数据容器
	var data []_PieJson

	// 开始获取统计
	for _, v := range incomeTypeList {
		var incomeLog []paylog.IncomeLog
		if err := global.DB.Where("user_id = ? AND income_type_id = ?", global.AuthUser.UserId, v.Id).
			Where("time >= ? AND time < ?", startDate, endDate).
			Find(&incomeLog); err.Error != nil {
			return ctx.JSON(fiber.Map{
				"status":  "error",
				"message": "根据分类获取收入数据出错！" + err.Error.Error(),
			})
		}

		// 汇总数据
		total := float64(0)
		for _, x := range incomeLog {
			total = total + x.Money
		}
		total = utils.NumberToStr(total)
		data = append(data, _PieJson{
			Name:  v.Name,
			Value: total,
		})
	}

	// list排序
	sort.Slice(data, func(i, j int) bool {
		return data[i].Value < data[j].Value // 可以将<号修改为>更换为倒序排序
	})

	// 返回
	return ctx.JSON(fiber.Map{
		"status": "done",
		"data":   data,
	})
}
